import re
def is_valid_id_card(id_card):
    # 18 位身份证正则
    pattern_18 = r'^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$'
    # 15 位身份证正则
    pattern_15 = r'^[1-9]\d{5}\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}$'

    # 使用 re.match()，但必须加 ^ 和 $ 确保完整匹配
    if re.match(pattern_18, id_card):
        return True
    elif re.match(pattern_15, id_card):
        return True
    else:
        return False


# 测试
id_card = "11010519900307603X"  # 18 位
print(is_valid_id_card(id_card))  # True

id_card = "110105900307603"  # 15 位
print(is_valid_id_card(id_card))  # True

id_card = "123456789012345678"  # 错误
print(is_valid_id_card(id_card))  # False